今日目標
如何跟路由溝通,在第 20 天時有介紹過如何使用
今天帶各位新增一個路由,並在畫面顯示結果
首先在模組根目錄增加 controller
的資料夾
接著新增 [main.py](http://main.py)
,並輸入底下內容
# ironman_js/controller/main.py
# -*- encoding: utf-8 -*-
from odoo.http import route, Controller, request
class Main(Controller):
@route('/ironman/data/sale_total', type='json', auth="user")
def sale_total(self):
orders = request.env['sale.order'].sudo().search([])
return {
'total': sum(order.amount_total for order in orders),
}
老樣子,有增加 python 檔案,就是要向 __init__.py
註冊
# ironman_js/controller/__init__.py
# -*- encoding: utf-8 -*-
from . import main
# ironman_js/__init__.py
# -*- encoding: utf-8 -*-
from . import models
from . import controller
接著調整模板,在 table
的下方加入內容
<!-- ironman_js/static/src/xml/action_view.xml -->
<hr/>
<div>
<h3>銷售總額: <t t-esc="widget.soAmountTotal"/></h3>
</div>
接著回頭調整 JS,在 willStart
階段增加一個 _rpc
來向路由發出請求
這裡直接提供整個函式,各位可以自行前後比較一下
willStart: async function () {
let def = this._super(...arguments);
let dataPromise = this._rpc({
model: 'todo.list',
method: 'get_self_todo_list',
args: [[]],
});
let amountPromise = this._rpc({
route: '/ironman/data/sale_total',
});
let [defReturn, data, amount] = await Promise.all([def, dataPromise, amountPromise]);
this.todoList = data || [];
this.soAmountTotal = amount.total || 0;
return defReturn;
},
完成後重新啟動伺服器,重新整理網頁後就能看到結果囉